#if !defined(___SYS_H)
#define ___SYS_H

/*====================== Constant =======================================*/

#if defined(___SYS_I386)
#define PGBIT 12
#else
#error Missing system
#endif

/*====================== Macro ==========================================*/

#if !defined(___GUI)
#define MAIN \
  int main(int argc,char **argv) \
  { /*MessageBox(NULL,"Hello/1","Hello/1 Demo",MB_OK);*/ \
    return ((int)prog((N4)argc-1,(Str *)argv+1)); \
  }
#elif defined(___OS_WIN)
#define MAIN \
  N4 parset(Str *pp,Str p1,Str p2); \
  int APIENTRY WinMain(HINSTANCE Inst,HINSTANCE prInst,LPSTR CmdLn,int CmdSh) \
  { N4 num; Str *par,p2; \
    num=parset(NULL,CmdLn,NULL); \
    if (!(p2=MemGet(StrLen(CmdLn)+1))) \
    { MessageBox(NULL,"MAIN","Error: Mem/Args (1)",MB_OK); \
      return (-1); \
    } \
    if (!(par=(Str *)MemGet((num+1)*sizeof(Str)))) \
    { MessageBox(NULL,"MAIN","Error: Mem/Args (2)",MB_OK); \
      return (-1); \
    } \
    par[num]=NULL; parset(par,CmdLn,p2); \
    /*MessageBox(NULL,"Hello/2","Hello/2 Demo",MB_OK);*/ \
    return ((Ix)prog(num,par)); \
  }
#else
#error Missing OS
#endif

#define PGLEN            Bit(PGBIT)
#define mpg(n)           ((Typ(N4,n)+PGLEN-1)&~(PGLEN-1))

/*====================== Structure ======================================*/

typedef struct _tTime
{ N2 year;
  N1 month;
  N1 day;
  N1 hour;
  N1 min;
  N1 sec;
  N2 msec;

  N1 wday;
  N1 yday;
} tTime;

/*====================== Variable =======================================*/

#if !defined(___SYS_C)
extern N1 isth;
extern Str TypSys;
extern Str TypOS;
#endif

/*====================== Function =======================================*/

/* Base */

N4 prog(N4 num,Str *par);
xx SysInit(xx);
xx SysExit(N4 ret);

/* Time */
/* secs: Since 1970.01.01 00:00:00 */
N4 TimeGet(N4 *msec);
N4 TimeSet(N4 tms,N4 msec);
xx TimeWait(N4 tmm);
N4 TimeConv(N1 bk,tTime *dt,N4 *tms);

/* Environment */

N4 EnvGet(Str s1,Str s2,N4 l2);
N4 EnvSet(Str s1,Str s2);
N4 CwdGet(Str nam,N4 nlen);
N4 CwdSet(Str nam);
N4 SysCmd(Str cmd);
N4 DirList(Str nam,Str buf,N4 len);

/* Module */

N4 MemExe(Ptr mem,N4 len);
N4 LibOpen(Str nam);
xx LibClose(N4 id);
Ptr AdrGet(N4 id,Str nam);
xx AdrRel(N4 id,Ptr adr);

/* Thread */

N4 ThBeg(fFun fun,N4 par);
xx ThEnd(N4 id);
N4 ThId(xx);
N4 ThLkGet(xx);
xx ThLkRel(N4 id);
N4 ThLkBeg(N4 id);
N4 ThLkEnd(N4 id);

N4 ThEvtGet(xx);
xx ThEvtRel(N4 id);
N4 ThEvtSet(N4 id);
N4 ThEvtNul(N4 id);
xx ThEvtWait(N4 id,N4 lk,N4 tmm);
N4 ThEvtSet2(N4 id,N4 lk);

/*=======================================================================*/

#endif
